package com.jt.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.fasterxml.jackson.databind.util.JSONPObject;
import com.jt.pojo.User;
import com.jt.service.DubboItemService;
import com.jt.service.DubboUserService;
import com.jt.service.HttpClientService;
import com.jt.util.CookieUtil;
import com.jt.vo.SysResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.configurationprocessor.json.JSONObject;
import org.springframework.boot.web.servlet.server.Session;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import redis.clients.jedis.JedisCluster;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * @author 张琪
 * @date 2020/12/11
 * @describe
 */
@Controller
@RequestMapping("/user")
public class UserController {
    /**
     * 实现用户页面的通用跳转
     * url: http://www.jt.com/user/login.html
     * url: http://www.jt.com/user/register.html
     */

    @Autowired
    private HttpClientService httpClientService;

    @Reference(check = false)              // 在消费者部分使用reference, 用来提供业务对象
    private DubboUserService userService;


    @Autowired
    private JedisCluster jedisCluster;

    //    使用常量定义cookie的名称
    private static final String JT_TICKET = "JT_TICKET";

    /*-------------------------------------页面请求----------------------------------*/
    @RequestMapping("/{moduleName}")
    public String moduleName(@PathVariable String moduleName) {
        return moduleName;
    }

    /**
     * 点击退出按钮, 完成用户的注销功能
     * 重定向到系统首页
     * 删除cookie记录   有效期设置0
     * 删除redis      根据key来删除     key从哪来???      提示  request对象
     */

    @RequestMapping("/logout")
    public String moduleName(HttpServletRequest request, HttpServletResponse response) {
       /*
       自己写的 , 有点问题
       try {
            response.sendRedirect("/index");
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "/";*/
//        获取客户端的cookie并修改剩余时间
/*      使用工具api前的复杂代码
      Cookie[] cookies = request.getCookies();
        if(cookies != null && cookies.length > 0){          // 数据校验
            for (Cookie cookie : cookies){
                if(JT_TICKET.equals(cookie.getName())){
                    String ticket = cookie.getValue();
//                    删除redis的数据
                    jedisCluster.del(ticket);
//                    删除cookie的数据, 根据debug显示, 因为安全原因, 服务器获取的cookie只能获取到k-v结构,
//                    并不能获取其他的数据
                    cookie.setMaxAge(0);    // 0表示立即删除,  -1 表示浏览器关闭后删除
                    cookie.setDomain("jt.com");
                    cookie.setPath("/");
                    response.addCookie(cookie);
                }
            }
        }*/

//        Cookie cookie = CookieUtil.getCookie(request, JT_TICKET);
        String ticket = CookieUtil.getCookieValue(request, JT_TICKET);
        if (StringUtils.hasLength(ticket)) {
            jedisCluster.del(ticket);
//            cookieValue可以随便设置, 因为删除的原理就是通过key值相同的cookie来顶替掉原来的cookie从而完成删除操作的
            CookieUtil.addCookie(response, JT_TICKET, "", "/", "jt.com", 0);
        }


//        重定向到系统首页
        return "redirect:/";
    }


    /**
     * 功能: 用户注册
     * url: http://www.jt.com/user/doRegister
     * 参数: password: admin123
     * 　username: admin1234
     * phone: 13144445555
     * 返回值: SysResult 对象
     */
    /*---------------------------------------非页面请求-----------------------------*/
    @RequestMapping("/doRegister")
    @ResponseBody
    public SysResult saveUser(User user) {
        userService.saveUser(user);
        return SysResult.success();
    }

    @RequestMapping("/doLogin")
    @ResponseBody
    public SysResult userLogin(User user, HttpServletResponse response) {
//        根据用户信息, 从后端获取ticket信息, 如果查不到用户信息, 则返回null
        String ticket = userService.findUserByUp(user);
        if (!StringUtils.hasLength(ticket)) {
            return SysResult.fault();
        }

//        用户信息验证过后, 将ticket存入cookie中, 实现单点登录功能
        Cookie cookie = new Cookie("JT_TICKET", ticket);
        cookie.setPath("/");        // 约定俗成, 可以使用/的路径来获取cookie, 如果为/user, 那么获取cookie必须通过该路径才能获取
        cookie.setMaxAge(7 * 24 * 60 * 60);
        cookie.setDomain("jt.com");     // 主要域名中有jt.com时, 则可以共享数据
        response.addCookie(cookie);


        return SysResult.success();
    }

    @RequestMapping("/findUserList")
    @ResponseBody
    public List<User> doFindUserList() {

        List<User> users = httpClientService.findUserList();
        System.out.println(users);
        return users;
    }


}
